<?php

/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */

/**
 * Description of ControladorCrawler
 *
 * @author Bruno
 */
include './Aranha.php';

class ControladorAranha {
    /*
     * @ var $arr_obj_crawler : Todos os objetos do tipo crawler guardados
     * @ var $mat_resultados : Os resultados feito pelas crawlers
     * @ var $int_idDoCrawler : Os ID'S dados aos crawler criados
     * @ var $int_quantidadeCrawler : Quantidade de crawlers ativos no momento
     * @ var $boo_controladorAtivo : Se o controlador esta ligado/desligado
     * @ var $boo_pause : Estado se o controlador esta pausado
     * @ var $boo_existeAranhasPausadas : Se existe alguma aranha pausada no momento
     * @ var $boo_espacoBancoCrawler : Se existe espaço em banco que armazenara o conteudo 
     */

    private $int_idDaAranha = 0;
    private $boo_controladorAtivo = true;
    private $boo_pause = false;
    private $boo_existeAranhasPausados = false;
    private $boo_espacoBancoAranha = false;
    private $arr_obj_aranha = array();
    private $arr_resultado = array();
    private $int_qtdAranha;

    public function getInt_idDaAranha() {
        return $this->int_idDaAranha;
    }

    public function getBoo_controladorAtivo() {
        return $this->boo_controladorAtivo;
    }

    public function getBoo_pause() {
        return $this->boo_pause;
    }

    public function getBoo_existeAranhasPausadss() {
        return $this->boo_existeAranhasPausados;
    }

    public function getBoo_espacoBancoAranha() {
        return $this->boo_espacoBancoAranha;
    }

    public function getArr_obj_aranha() {
        return $this->arr_obj_aranha;
    }

    public function addArr_obj_aranha($obj_aranha) {
        return $this->arr_obj_aranha[] = ($obj_aranha);
    }

    public function getArr_resultado() {
        return $this->arr_resultado;
    }

    public function getInt_qtdAranha() {
        return $this->int_qtdAranha;
    }

    public function setInt_idDaAranha($int_idDaAranha) {
        $this->int_idDaAranha = $int_idDaAranha;
    }

    public function setBoo_controladorAtivo($boo_controladorAtivo) {
        $this->boo_controladorAtivo = $boo_controladorAtivo;
    }

    public function setBoo_pause($boo_pause) {
        $this->boo_pause = $boo_pause;
    }

    public function setBoo_existeAranhasPausados($boo_existeAranhasPausadas) {
        $this->boo_existeAranhasPausados = $boo_existeAranhasPausadas;
    }

    public function setBoo_espacoBancoAranha($boo_espacoBancoAranha) {
        $this->boo_espacoBancoAranha = $boo_espacoBancoAranha;
    }

    public function setArr_obj_aranha($arr_obj_crawler) {
        $this->arr_obj_aranha = $arr_obj_crawler;
    }

    public function setArr_resultado($str_resultado) {
        $this->arr_resultado = $str_resultado;
    }

    public function setInt_qtdAranha($int_qtdAranha) {
        $this->int_qtdAranha = $int_qtdAranha;
    }

    public function delPosicaoArr_obj_aranha($par_int_IdAranha) {
        //$this->arr_obj_crawler[] = $arr_obj_crawler;
        unset($this->arr_obj_aranha[$par_int_IdAranha]);
    }

    public function OrganizarArr_obj_aranha() {
        //Reindexa todos os elementos do array
        $this->setArr_obj_aranha(array_values($this->getArr_obj_aranha()));
    }

    /*
     * Metodo principal do controlador de crawlers
     */

    function iniciarControladorCrawler() {

        //Se estiver aranhas ativas
        if ($this->getInt_qtdAranha() > 0) {


            //Se o controlador estiver ativo

            if ($this->getBoo_controladorAtivo() == TRUE &&
                    $this->getBoo_pause() == TRUE &&
                    $this->getBoo_existeAranhasPausadss() == TRUE) {
                //TTT
                $this->InformativoAranhasPausadas();
            } else if ($this->getBoo_controladorAtivo() == TRUE &&
                    $this->getBoo_pause() == TRUE &&
                    $this->getBoo_existeAranhasPausadss() == FALSE) {

                //TTF
                $this->pausarTodasAranhas();
            } else if ($this->getBoo_controladorAtivo() == TRUE &&
                    $this->getBoo_pause() == FALSE &&
                    $this->getBoo_existeAranhasPausadss() == TRUE) {

                //TFT
                $this->despausarTodasAranhas();
            } else if ($this->getBoo_controladorAtivo() == TRUE &&
                    $this->getBoo_pause() == FALSE &&
                    $this->getBoo_existeAranhasPausadss() == FALSE) {
                //Ciclo de rotina
                //TFF
                $this->manutencaoDosCrawlers();
            } else {
                //Desativar todos crawlers
                //F**
                $this->desativasTodasAranhas();
//                    
            }
        }
    }

//Fim ligar controlador

    function InformativoAranhasPausadas() {
        //Exibe em tela ou algo do genero que esta nesse ponto
    }

    function pausarTodasAranhas() {
        //While em todos crawlers
        //Existe crawlers pausados
        $this->setBoo_existeAranhasPausados(TRUE);

        $int_qtdArray = count($this->getInt_qtdAranha());
        if ($int_qtdArray > 0) {
            $aranha->setBoo_pause(TRUE);
        }
        for ($int_cont = 0; $int_cont < $int_qtdArray; $int_cont++) {
            $aranha = $this->getArr_obj_aranha()[$int_cont];
        }
    }

    function despausarTodasAranhas() {
        //While em todos crawlers

        $int_qtdArray = count($this->getInt_qtdAranha());
        for ($int_cont = 0; $int_cont < $int_qtdArray; $int_cont++) {
            $aranha = $this->getArr_obj_aranha()[$int_cont];
            $aranha->setBoo_pause(FALSE);
        }
        $this->setBoo_existeAranhasPausados(FALSE);
    }

    function manutencaoDosCrawlers() {
        $int_qtdArray = $this->getInt_qtdAranha();

        for ($int_cont = 0; $int_cont < $int_qtdArray; $int_cont++) {
            $aranha = $this->getArr_obj_aranha()[$int_cont];

            //Alimenta o crawler
            if ($aranha->getStr_paginaEndereco() == '' &&
                    $aranha->getBoo_conteudo() == FALSE) {
                //Alimentando aqui
                //coleta, limpa, alimenta, inicia()
            } else if ($aranha->getBoo_aranhaAtiva() &&
                    $aranha->getBoo_pause() &&
                    $aranha->getBoo_conteudo() &&
                    $aranha->getBoo_bloqueada() == FALSE) {


                $aranha->setBoo_bloqueada(TRUE);
                $this->setArr_resultado($aranha->getArr_linksValidos());



                //Limpando o crawler
                $aranha->setBoo_conteudo(false);
                $aranha->setArr_linksValidos();

                //Guardar o resutado no banco MYSQL
                //METODO PARA O MYSQL
                //Pega proximo link a trabalhar no banco MySQL------------------
                //METODO PARA O MYSQL
                //Trata a consulta e armazena em variaveis
                //$crawler->setStr_charset('CHARSET DO BANCO');
                //$crawler->setStr_site('SITE DO BANCO');
                //Inicia o crawler
                //$crawler->IniciarCrawler();
            } else if ($aranha->getBoo_aranhaAtiva() == FALSE &&
                    $aranha->getBoo_bloqueada() == FALSE &&
                    $aranha->getBoo_conteudo()
            ) {
                //Coleta, Limpa, quantidade -1, destroy
                $this->setArr_resultado($aranha->getArr_linksValidos());
                $this->setInt_qtdAranha($this->getInt_qtdAranha() - 1);
                $this->deletarAranha($aranha->getInt_idAranha());
            } else {
                //Registra o log, crawler com seu estado e atributos
            }
        }
    }

    function desativarUmaAranha($int_idAranha = null) {
        $int_qtdAranha = $this->getInt_qtdAranha();
        $aranha = null;

        if ($int_idAranha != null) {
            //Desativa um crawlers
            for ($int_cont = 0; $int_cont < $int_qtdCrawlers; $int_cont++) {
                $aranha = $this->getArr_obj_aranha()[$int_cont];

                if ($aranha->getInt_idAranha() == $int_idAranha) {
                    //Bloqueia em tela o click nele
                    //Desativando
                    $aranha->setBoo_crawlerAtivo(FALSE);
                    //Sair do laço
                    break;
                }
            }
        } else {
            //Id == NULL
            //LOG de erro
        }
    }

    function pausarUmaAranha($int_idAranha = null) {
        $int_qtdCrawlers = ($this->getInt_quantidadeCrawler());
        $aranha = null;

        if ($int_idAranha != null) {
            //Desativa um crawlers
            for ($int_cont = 0; $int_cont < $int_qtdCrawlers; $int_cont++) {
                $aranha = $this->getArr_obj_aranha()[$int_cont];

                if ($aranha->getInt_idAranha() == $int_idAranha) {

                    //Desativando
                    $aranha->setBoo_pause(FALSE);
                    //Sair do laço
                    break;
                }
            }
        } else {
            //Id == NULL ------------------------------------------------------
            //LOG de erro
        }
    }

    function desativasTodasAranhas() {
        //****Bloquer função criar novos crawler ou pausar até completar


        $int_qtdAranha = ($this->getInt_qtdAranha());

        //Desativa todo crawlers
        for ($int_cont = 0; $int_cont < $int_qtdAranha; $int_cont++) {
            $aranha = $this->getArr_obj_aranha()[$int_cont];
            $aranha->setBoo_aranhaAtiva(FALSE);
        }

        //Enquanto existir crawler para trabalhar continue
        while (count($this->getInt_qtdAranha()) > 0) {
            $int_qtdAranha = ($this->getInt_qtdAranha());

//Recolhe os resultados
            for ($int_cont = 0; $int_cont < $int_qtdAranha; $int_cont++) {
                $aranha = $this->getArr_obj_aranha()[$int_cont];
                //Se o resultado do crawler estiver pronto
                if ($aranha->getBoo_conteudo()) {
                    //Pegando o resultado do crawler
                    $this->setArr_resultado($aranha->getArr_linksValidos());

                    //Guarda o resultado no banco
                    //MEtodo para guardar no banco------------------------------
                    //Manutenção dos objetos e atributos
                    $this->delPosicaoArr_obj_aranha($int_cont);
                    $this->setInt_qtdAranha(($this->getInt_qtdAranha()) - 1);
                }
            }
        }
        //****Detravar funções de criar ou pausar crawlers
    }

    function criarAranha() {
   
        //Instancia o objeto
//        $c = new Crawler($this->getInt_idDoCrawler());
        $aranha = new Aranha($this->getInt_idDaAranha());

        //Codigo para teste-----------------------------------------------------
        $aranha->setStr_paginaEndereco('www.uol.com.br/');
        
        //Adiciona o crawler ao array 
        $this->addArr_obj_aranha($aranha);
        //Incrementa o contador de id dos crawlers
        $this->setInt_idDaAranha(($this->getInt_idDaAranha()) + 1);
        //Aumenta a quantidade de crawlers 
        $this->setInt_qtdAranha(($this->getInt_qtdAranha()) + 1);

        //Iniciar a aranha------------------------------------------------------
        $aranha->IniciarAranha();
        

        //Atualizar em tela o objeto criado
    }

    function deletarAranha($par_int_idAranha = null) {
        //Se o codigo não for nulo
        if ($par_int_idAranha != null) {
            $int_qtdArray = count($this->getInt_qtdAranha());
            for ($int_cont = 0; $int_cont < $int_qtdArray; $int_cont++) {
                $aranha = $this->getArr_obj_aranha()[$int_cont];
                $int_IdAranha = $aranha->getInt_idAranha();

                if ($par_int_idAranha == $int_IdAranha) {
                    $this->delPosicaoArr_obj_aranha($int_cont);
                    $this->OrganizarArr_obj_aranha();
                    break;
                }
            }
        } else {
            //Mensagem de erro
        }
    }

}

$con = new ControladorAranha();
$con->criarAranha();
